package com.example.design.leetcode.arrayAndString;

// 剑指 Offer 39. 数组中出现次数超过一半的数字

//数组中有一个数字出现的次数超过数组长度的一半，请找出这个数字。
//
//    你可以假设数组是非空的，并且给定的数组总是存在多数元素。
//
//    示例1:
//    输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
//    输出: 2
//    限制：
//    1 <= 数组长度 <= 50000
//    注意：本题与主站 169 题相同：https://leetcode-cn.com/problems/majority-element/


import java.util.HashMap;
import java.util.Map;

//标签：摩尔投票
public class Practice07 {
    /**
     * 使用map
     * @param nums
     * @return
     */
    public static int majorityElement(int[] nums) {
        if (nums.length == 0) {
            return 0;
        }

        Map<Integer, Integer> map = new HashMap<>();
        for (int num : nums) {
            Integer count = map.get(num);
            if (count == null) {
                count = 1;
            } else {
                count++;
            }
            map.put(num, count);
        }

        int length = nums.length;
        for (Integer key : map.keySet()) {
            Integer count = map.get(key);
            if (count > (length/2)) {
                return key;
            }
        }
        return 0;
    }

    /**
     * 使用摩尔投票
     */

    public static int majorityElement2(int[] nums) {
        int count = 0;
        int cur = 0;

        for (int num : nums) {
            if (count==0) {
                cur = num;
            }
            if (cur == num) {
                count++;
            } else {
                count--;
            }
        }
        return cur;
    }

    public static void main(String[] args) {
        int[] s = new int[]{1,2,3,2,2,2,5,4,2};
        majorityElement(s);
    }
}
